package com.linkgie.galaxyframework.crypto;

import java.util.HashMap;
import java.util.Map;

import com.linkgie.galaxyframework.crypto.ChecksumGenerator.Message;
import com.linkgie.galaxyframework.crypto.ChecksumGenerator.MessageGenerator;
import com.linkgie.galaxyframework.utils.ApplicationException;

public abstract class VersioningMessageGenerator<T> implements MessageGenerator<T>{


	private Map<String, MessageGenerator<T>> versionGenerators = new HashMap<>();
	
	public VersioningMessageGenerator() {
	}
	
	/**
	 * 获取指定输入对象对应的消息版本；
	 * 
	 * @param input 输入对象；
	 * @return
	 */
	protected abstract long getMessageVersion(T input);
	
	@Override
	public void generate(T input, Message message) {	
		long version = getMessageVersion(input);
		MessageGenerator<T> messageGenerator = versionGenerators.get(Long.toString(version));
		if (messageGenerator == null) {
			throw new ApplicationException(
					"No collector for version[" + version + "] of data type[" + input.getClass().getName() + "]!");
		}
		messageGenerator.generate(input, message);
	}
	

	/**
	 * 增加指定版本的消息生成器；
	 * 
	 * @param version
	 * @param messageGenerator
	 */
	public void addVersion(long version, MessageGenerator<T> messageGenerator) {
		versionGenerators.put(Long.toString(version), messageGenerator);
	}

}
